linux下生成core dump方法与gdb解析core dump文件 您所在的位置:网站首页 coredump java linux下生成core dump方法与gdb解析core dump文件

linux下生成core dump方法与gdb解析core dump文件

#linux下生成core dump方法与gdb解析core dump文件| 来源: 网络整理| 查看: 265

core dump文件 core dump 又叫核心转储,是一个程序运行时的环境一个集合包,包含崩溃时的堆栈信息,是一个二进制文件,无法使用记事本打开,一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象,主要用来调试。 core dump文件的生成和大小限制 linux系统more默认关闭coredump文件的生成,因为需要占用一部分系统开销。 检查系统core dump功能是否开启,0为关闭

[root@vsftpd ~]# ulimit -c 0

查询结果为0,表示关闭了此功能。

查看详细显示信息

[root@vsftpd ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7200 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7200 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

开启core dump功能 临时开启core dump功能,重启或者重新登录会失效。

[root@vsftpd ~]# ulimit -c unlimited #生成文件大小不受限制 [root@vsftpd ~]# ulimit -c unlimited [root@vsftpd ~]# ulimit -c 1024 #限制生成coredump文件大小为1024K [root@vsftpd ~]# ulimit -c 1024

永久开启core dump功能,需要修改配置文件/etc/security/limits.conf

[root@vsftpd ~]# more /etc/security/limits.conf * soft core unlimited

登出重新连接即可生效

指定core dump文件的名称格式 默认情况下系统生成的core dump文件不带其他拓展名,全部命名为core。此时新生成文件会覆盖掉旧的core文件; core dump文件的参数说明

%% 单个%字符 %p dump进程的进程ID %u dump进程的用户ID %g dump进程的组ID %s 导致core dump的信号 %t core dump 的时间 %h 主机名 %e 程序文件名

使core文件名称是否带有pid,配置文件/proc/sys/kernel/core_uses_pid的内容为1,添加pid,0为不添加pid;

[root@vsftpd ~]# more /proc/sys/kernel/core_uses_pid 1

定义core文件的名称格式为core-%e-%p-%t,配置文件默认文件名为core

[root@vsftpd ~]# more /proc/sys/kernel/core_pattern core [root@vsftpd ~]# echo 'core-%e-%p-%t' > /proc/sys/kernel/core_pattern [root@vsftpd ~]# more /proc/sys/kernel/core_pattern core-%e-%p-%t

指定core dump文件的生成路径 系统默认的core文件生成路径是/var/logs,但/var/logs目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core dump后并没能生成core文件。指定core dump文件存在/dump/目录下,格式自定义

[root@vsftpd ~]# mkdir /dump/ [root@vsftpd ~]# echo '/dump/core-%e-%p-%t' > /proc/sys/kernel/core_pattern [root@vsftpd ~]# more /proc/sys/kernel/core_pattern /dump/core-%e-%p-%t [root@vsftpd ~]#

关闭core dump文件的生成 临时关闭core dump文件的生成功能

[root@vsftpd ~]# ulimit -c 0 [root@vsftpd ~]# ulimit -c 0

永久关闭core dump功能,需要修改配置文件/etc/security/limits.conf

[root@vsftpd ~]# more /etc/security/limits.conf * soft core 0 测试生成core dump文件

在linux系统下,如果send、recv、write在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。core dump文件一般是在收到某个信号的时候结束产生,如果不指定特定的信号,应用程序按默认方式处理,默认处理的信号如下:

3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 11) SIGSEGV 31) SIGSYS 24) SIGXCPU 25) SIGXFSZ 29) SIGIO

利用默认信号生成core dump文件

[root@vsftpd ~]# kill -s SIGSEGV $$ [root@vsftpd ~]# file /dump/core-bash-3120-1562140702 /dump/core-bash-3120-1562140702: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '-bash', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: '/bin/bash', platform: 'x86_64'

利用C编译生成core dump文件小程序

[root@vsftpd ~]# more a.c #include int main() { char *ptr="linuxers.cn"; *ptr=0; } 编译运行程序 [root@vsftpd ~]# gcc -g -o 1 a.c [root@vsftpd ~]# ./1 Segmentation fault (core dumped) [root@vsftpd ~]# file /dump/core-1-3295-1562141671 /dump/core-1-3295-1562141671: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './1', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './1', platform: 'x86_64' 解析core dump文件

使用gdb解析core dump文件

安装gdb

[root@vsftpd ~]# gdb -bash: gdb: command not found [root@vsftpd ~]# yum install -y gdb.x86_64

gdb进行查看core文件的内容, 以定位文件中引发core dump的行;

gdb格式如下: gdb [exec file] [core file] [exec file]表示之前使用gcc编译的程序 [core file]表示之前产生的dump文件

使用gdb查看core dump文件

[root@vsftpd ~]# gdb ./1 /dump/core-1-3295-1562141671 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /root/1...done. [New LWP 3295] Core was generated by `./1'. Program terminated with signal 11, Segmentation fault. #0 0x00000000004004dd in main () at a.c:5 5 *ptr=0; Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64

利用gdb命令进行调试

查看调用堆栈信息

(gdb) bt #0 0x00000000004004dd in main () at a.c:5

查看出现问题时的汇编代码

(gdb) disass Dump of assembler code for function main: 0x00000000004004cd : push %rbp 0x00000000004004ce : mov %rsp,%rbp 0x00000000004004d1 : movq $0x400580,-0x8(%rbp) 0x00000000004004d9 : mov -0x8(%rbp),%rax => 0x00000000004004dd : movb $0x0,(%rax) 0x00000000004004e0 : pop %rbp 0x00000000004004e1 : retq End of assembler dump.

查看对应寄存器的值

(gdb) info reg rax 0x400580 4195712 rbx 0x0 0 rcx 0x4004f0 4195568 rdx 0x7ffc9fe2d5d8 140722990929368 rsi 0x7ffc9fe2d5c8 140722990929352 rdi 0x1 1 rbp 0x7ffc9fe2d4e0 0x7ffc9fe2d4e0 rsp 0x7ffc9fe2d4e0 0x7ffc9fe2d4e0 r8 0x7f1982996e80 139747542003328 r9 0x0 0 r10 0x7ffc9fe2cfe0 140722990927840 r11 0x7f19825f12e0 139747538178784 r12 0x4003e0 4195296 r13 0x7ffc9fe2d5c0 140722990929344 r14 0x0 0 r15 0x0 0 rip 0x4004dd 0x4004dd eflags 0x10246 [ PF ZF IF RF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 valgrind 软件


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有